package com.hejjon.graph;

import java.util.ArrayList;
import java.util.Arrays;

/**
 *
 *  图
 * @author: caoshi
 * @date: 2023-01-24 19:07:22
 * @since: 1.0
 */
public class Graph {

    /**
     * 顶点集合
     */
    private ArrayList<String> vertexList;

    /**
     * 图对应的邻接矩阵
     */
    private int[][] edges;

    /**
     * 边的数目
     */
    private int numOfEdges;


    /**
     * 构造方法
     * @param n 节点数目
     */
    public Graph(int n) {
        this.vertexList = new ArrayList<>(n);
        this.edges = new int[n][n];
        this.numOfEdges = 0;
    }

    /**
     * 图中常用的方法
     */
    /**
     * 获取节点的个数
     * @return
     */
    public int getNumOfVertex() {
        return vertexList.size();
    }

    /**
     * 获取边的数目
     * @return
     */
    public int getNumOfEdges() {
        return this.numOfEdges;
    }

    /**
     * 插入节点
     * @param vertex    节点
     */
    public void insertVertex(String vertex) {
        vertexList.add(vertex);
    }

    /**
     *  添加边 (无向图)
     * @param v1    v1 第一个节点的下标, 即第几个节点   "A" - "B"   "A" -> 0   "B" -> 1
     * @param v2    v2 第二个节点的下标
     * @param weight    权重
     */
    public void insertEdge(int v1, int v2, int weight) {
        this.edges[v1][v2] = weight;
        this.edges[v2][v1] = weight;
        numOfEdges++;
    }

    /**
     * 获取节点i(下标)对应的节点
     * @param i
     * @return
     */
    public String getValueByIndex(int i) {
        return vertexList.get(i);
    }

    /**
     * 返回v1 和 v2 的权重 (有权图)
     * @param v1
     * @param v2
     * @return
     */
    public int getWeight(int v1, int v2) {
        return edges[v1][v2];
    }

    /**
     * 显示图的邻接矩阵
     */
    public void showGraph() {
        for (int[] link : this.edges) {
            System.err.println(Arrays.toString(link));
        }
    }





}
